package com.wryyyyy.service.impl;

import org.springframework.stereotype.Service;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static com.wryyyyy.utils.SystemConstants.ARGS_LENGTH;

@Service
//执行c++程序的代码
public class CppProgramExecutor {
//    programPath：C++可执行文件位置；arguments：命令行参数（进程属性集）；
    public String[] executeCppProgram(String programPath, String... arguments) {
        /**
         * ProcessBuilder：此类用于创建操作系统进程，它提供一种启动和管理进程（也就是应用程序）的方法
         *         每个 ProcessBuilder 实例管理一个进程属性集。它的 start() 方法利用这些属性创建一个新的 Process 实例。
         *         start() 方法可以从同一实例重复调用，以利用相同的或相关的属性创建新的子进程。
         */

        List<String> args = new ArrayList<>();
        args.add(programPath);
        args.addAll(Arrays.asList(arguments));
//        System.out.println(Arrays.toString(arguments));

        ProcessBuilder processBuilder = new ProcessBuilder(args);
        // 某个c++进程
        Process process;
//        StringBuilder output = new StringBuilder();
        List<String> output = new ArrayList<>();

        try {
            process = processBuilder.start();
            // 读取参数（原控制台输入）
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
//                output.append(line).append("\n");
                output.add(line);
            }
//            waitFor() 等待控制台输入？
            int exitCode = process.waitFor();
            if (exitCode != 0) {
                throw new RuntimeException("C++ program exited with code " + exitCode);
            }
        } catch (IOException | InterruptedException e) {
            throw new RuntimeException("Error executing C++ program", e);
        }

//        返回控制台输入？
        return output.toArray(new String[]{});
    }
}